package com.tedu.api.thread;

import org.junit.Test;

import java.io.File;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

/**
 * Lambda表达式----    ()->{}    【接口/抽象类----匿名内部类】
 *                               【集合遍历--匿名内部类】
 *Collection-----> List:存重复的元素并且有序【保存数据结构一致】
 *                 Set:存无序并且不重复【保存数据结构一致】
 *                 Queue:队列结合业务
 *Map------------->HashMap:键值对储存
 */
public class LambdaDemo {
    @Test
    public void testList() {
        //List集合：保存元素
        List<String> list = new ArrayList<>();
        list.add("王俊凯");
        list.add("王源");
        list.add("易烊千玺");
        list.add("陈奕恒");
        //集合几种遍历方式:普通for、增强for、支持forEach方法
        for (String str : list) {
            System.out.println("增强for：" + str);
        }

        //支持forEach方法:遍历集合元素
        //Consumer接口针对List、Set、Queue集合提供接口：功能获取List集合元素
        //accept() 获取List集合所有元素
        list.forEach(new Consumer<String>() {
            public void accept(String s) {
                System.out.println("Consumer接口遍历方案：" + s);
            }
        });
        //支持forEach方法:遍历集合元素【Consumer 匿名内部类】
        //编写Lambda表达式写法
        list.forEach(s -> System.out.println("Lambda遍历方案：" + s));
    }

    @Test
    public void testMap() {
        //创建Map集合:键值对
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "九龙坡");
        map.put(2, "重庆");
        map.put(3, "怀化");
        map.put(4, "英国");
        //遍历集合 增强for  普通for   forEach(BiConSummer接口--匿名内部类)
        //键值对--->一组Entry对象
        //BiConSummer接口获取每组Entry对象--accept()获取一组Entry
        map.forEach(new BiConsumer<Integer, String>() {
            public void accept(Integer integer, String s) {
                System.out.println("BiConsumer 获取集合元素：" + integer + s);
            }
        });
        //使用Lambda
        map.forEach((integer, s) -> System.out.println("Lambda获取集合元素：" + integer + s));
    }
    /**
     * 作业：   1.使用Lambda表达式完成Thread线程创建
     *         2.使用Lambda表达式完成Runnable线程创建
     *         3.IO流--File类：ListFile(FileFilter接口)
     *         目标：【io包下FilterAPI】实现使用Lambda表达式完成
     *         4.IO流---File类：listFile(FileFilter接口)【2行代码】
     *         目标：【io包下FilterAPI】实现使用Lambda表达式完成
     *         5.集合：【list包下ListAPI类下单元测试：testComparator()】
     */
    @Test
    public void LambdaHomework1(){
        //使用Lambda表达式完成Thread
        //Thread类Java定义线程类---具备启动Start---
        // Thread类封装Runnable类--线程启动run运行
        Thread t1=new Thread(()->{for(int i=0;i<1000;i++){
            System.out.println("抢到演唱会票了~");
        }});
        t1.start();
    }
    @Test
    public void LambdaHomework2(){
        //1.创建Runnable接口
        Runnable roy=()->{for(int i=0;i<1000;i++){
            System.out.println("生而自由 爱而无畏");
        }};
        //2.创建Thread线程类--start()
        Thread t2=new Thread(roy);
        roy.run();

    }
    @Test
    public void LambdaHomework3() {
        File file = new File("." + File.separator);
        File[] subs = file.listFiles((pathname) -> {
            return pathname.getName().startsWith("s");
        });

        //3.打印子项下的所有名字
        for (int i = 0; i < subs.length; i++) { //i 下标 从0开始
            System.out.println("所有文件和文件夹名：" + subs[i].getName());
        }
    }
    @Test
    public void LambdaHomework4(


    ) {
        for (File s : new File("." + File.separator ).listFiles((pathname) -> {
            return pathname.getName().startsWith("s");
        })) { //i 下标 从0开始
            System.out.println(s);
        }
    }
    @Test
    public void LambdaHomework5(){
        List<String> list=new ArrayList<>();
        list.add("王源");
        list.add("王俊凯");
        list.add("易烊千玺");
        Comparator <String>cp=(o1,o2)->{return o2.length()-o1.length();};
        Collections.sort(list,cp);
        System.out.println("排序后集合"+list);;
    }
}